home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / ctlib100.zip / INSTALL.LZH / MAIN.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-12  |  23KB  |  561 lines

  1. {**************************************************************************}
  2. {*  BitSoft Development, L.L.C.                                           *}
  3. {*  Copyright (C) 1995, 1996 BitSoft Development, L.L.C.                  *}
  4. {*  All rights reserved.                                                  *}
  5. {**************************************************************************}
  6.  
  7. unit Main;
  8.  
  9. {$X+}
  10.  
  11. interface
  12.  
  13. uses Drivers, Menus, Views, Objects, App, MsgBox, Gadgets, Types, Display;
  14.  
  15. type
  16.   PContainersDemo = ^TContainersDemo;
  17.   TContainersDemo = object(TApplication)
  18.       Clock      : PClockView;
  19.       HeapViewer : PHeapView;
  20.     constructor Init;
  21.     procedure AddClock; virtual;
  22.     procedure AddHeapViewer; virtual;
  23.     procedure HandleEvent(var Event : TEvent); virtual;
  24.     procedure Idle; virtual;
  25.     procedure InitMenuBar; virtual;
  26.     procedure SetNumberOfDuplicates;
  27.     procedure SetNumberOfItems;
  28.     procedure ShowAboutDialog;
  29.   end; { TContainersDemo }
  30.  
  31. implementation
  32.  
  33. uses Dialogs,
  34.      ctFields,
  35.      ListBox, Data, Utils, ObjTests;
  36.  
  37. {****************************************************************************}
  38. { TContainersDemo object                                                     }
  39. {****************************************************************************}
  40. {****************************************************************************}
  41. { TContainersDemo.Init                                                       }
  42. {****************************************************************************}
  43. constructor TContainersDemo.Init;
  44. begin
  45.   TApplication.Init;
  46.   AddClock;
  47.   AddHeapViewer;
  48.   DisableCommands([cmEmsStdArray, cmEmsStdObjectArray,
  49.     cmEmsObjectArray, cmEmsCollection, cmEmsSortedCollection,
  50.     cmEmsStringCollection, cmEmsUnSortedStrCollection, cmEmsStack]);
  51.   {$ifndef Windows}
  52.   {$ifndef DPMI}
  53.   EnableCommands([cmEmsStdArray, cmEmsStdObjectArray, cmEmsObjectArray,
  54.     cmEmsCollection, cmEmsSortedCollection, cmEmsStringCollection,
  55.     cmEmsUnSortedStrCollection, cmEmsStack]);
  56.   {$endif DPMI}
  57.   {$endif Windows}
  58.   RegisterType(RTestObject);
  59.   RegisterFields;
  60.   RegisterType(RTestStaticObject);
  61. end;
  62.  
  63. {****************************************************************************}
  64. { TContainersDemo.AddClock                                                   }
  65. {****************************************************************************}
  66. procedure TContainersDemo.AddClock;
  67. var
  68.   R : TRect;
  69. begin
  70.   GetExtent(R);
  71.   R.B.Y := R.A.Y + 1;
  72.   R.A.X := R.B.X - 9;
  73.   Clock := New(PClockView, Init(R));
  74.   Insert(Clock);
  75. end;
  76.  
  77. {****************************************************************************}
  78. { TContainersDemo.AddHeapViewer                                              }
  79. {****************************************************************************}
  80. procedure TContainersDemo.AddHeapViewer;
  81. var
  82.   R : TRect;
  83. begin
  84.   GetExtent(R);
  85.   R.A.Y := R.B.Y - 1;
  86.   R.A.X := R.B.X - 9;
  87.   HeapViewer := New(PHeapView, Init(R));
  88.   Insert(HeapViewer);
  89. end;
  90.  
  91. {****************************************************************************}
  92. { TContainersDemo.HandleEvent                                                }
  93. {****************************************************************************}
  94. procedure TContainersDemo.HandleEvent(var Event : TEvent);
  95.  
  96. {$ifdef ver60}
  97.     procedure DosShell;
  98.     begin
  99.       DoneSysError;
  100.       DoneEvents;
  101.       DoneVideo;
  102.       DoneMemory;
  103.       SetMemTop(HeapPtr);
  104.       PrintStr(DemoStrings^.Get(sShellMsg));
  105.       SwapVectors;
  106.       Exec(GetEnv('COMSPEC'), '');
  107.       SwapVectors;
  108.       SetMemTop(HeapEnd);
  109.       InitMemory;
  110.       InitVideo;
  111.       InitEvents;
  112.       InitSysError;
  113.       Redraw;
  114.     end; { GoToDos }
  115.  
  116.     procedure Tile;
  117.     var
  118.       R: TRect;
  119.     begin
  120.       Desktop^.GetExtent(R);
  121.       Desktop^.Tile(R);
  122.     end; { Tile }
  123.  
  124.     procedure Cascade;
  125.     var
  126.       R: TRect;
  127.     begin
  128.       Desktop^.GetExtent(R);
  129.       Desktop^.Cascade(R);
  130.     end; { Cascade }
  131. {$endif}
  132.  
  133.     procedure CloseAll;
  134.     begin
  135.        Dispose(Desktop, Done);
  136.        InitDesktop;
  137.        Insert(Desktop);
  138.     end; { CloseAll }
  139.  
  140.     procedure ChangeVideo;
  141.     var
  142.       NewMode : Word;
  143.     begin
  144.       Dispose(HeapViewer, Done);
  145.       NewMode := ScreenMode xor smFont8x8;
  146.       if NewMode and smFont8x8 <> 0 then
  147.         ShadowSize.X := 1
  148.       else
  149.         ShadowSize.X := 2;
  150.       SetScreenMode(NewMode);
  151.       AddHeapViewer;
  152.     end; { ChangeVideo }
  153.  
  154. begin
  155.   TApplication.HandleEvent(Event);
  156.   if Event.What = evCommand then
  157.        begin
  158.          case Event.Command of
  159.            { Application events }
  160.  
  161.            {$ifdef ver60}
  162.            cmDosShell        : DosShell;
  163.            cmTile            : Tile;
  164.            cmCascade         : Cascade;
  165.            {$endif}
  166.  
  167.            cmCloseAll        : CloseAll;
  168.            cmRefresh         : Application^.Redraw;
  169.            cmVideoMode       : ChangeVideo;
  170.            cmTotalItems      : SetNumberOfItems;
  171.            cmTotalDuplicates : SetNumberOfDuplicates;
  172.            cmAbout           : ShowAboutDialog;
  173.  
  174.            { Arrays }
  175.            cmStdArray : if CanStartNewTest
  176.                           then TestTStdArray;
  177.            cmResizableStdArray : if CanStartNewTest
  178.                                    then TestTResizableStdArray;
  179.            cmSortedStdArray : if CanStartNewTest
  180.                                 then TestTSortedStdArray;
  181.            cmStdObjectArray : if CanStartNewTest
  182.                                 then TestTStdObjectArray;
  183.            cmResizableStdObjectArray : if CanStartNewTest
  184.                                          then TestTResizableStdObjectArray;
  185.            cmSortedStdObjectArray : if CanStartNewTest
  186.                                       then TestTSortedStdObjectArray;
  187.            cmHugeArray : if CanStartNewTest
  188.                            then TestTHugeArray;
  189.            cmResizableHugeArray : if CanStartNewTest
  190.                                     then TestTResizableHugeArray;
  191.            cmSortedHugeArray : if CanStartNewTest
  192.                            then TestTSortedHugeArray;
  193.            cmHugeObjectArray : if CanStartNewTest
  194.                                  then TestTHugeObjectArray;
  195.            cmResizableHugeObjectArray : if CanStartNewTest
  196.                                           then TestTResizableHugeObjectArray;
  197.            cmSortedHugeObjectArray : if CanStartNewTest
  198.                                        then TestTSortedHugeObjectArray;
  199.            cmStreamStdArray : if CanStartNewTest
  200.                                 then TestTStreamStdArray;
  201.            cmEmsStdArray : if CanStartNewTest
  202.                              then TestTEmsStdArray;
  203.            cmStreamStdObjectArray : if CanStartNewTest
  204.                                       then TestTStreamStdObjectArray;
  205.            cmEmsStdObjectArray : if CanStartNewTest
  206.                                    then TestTEmsStdObjectArray;
  207.            cmStreamObjectArray : if CanStartNewTest
  208.                                    then TestTStreamObjectArray;
  209.            cmEmsObjectArray : if CanStartNewTest
  210.                                       then TestTEmsObjectArray;
  211.  
  212.            { Collections }
  213.            cmHugeCollection : if CanStartNewTest
  214.                                 then TestTHugeCollection;
  215.            cmHugeSortedCollection : if CanStartNewTest
  216.                                         then TestTHugeSortedCollection;
  217.            cmHugeStringCollection : if CanStartNewTest
  218.                                         then TestTHugeStringCollection;
  219.            cmHugeUnSortedStrCollection : if CanStartNewTest
  220.                                              then TestTHugeUnSortedStrCollection;
  221.            cmStreamCollection : if CanStartNewTest
  222.                                   then TestTStreamCollection;
  223.            cmEmsCollection : if CanStartNewTest
  224.                                then TestTEmsCollection;
  225.            cmStreamSortedCollection : if CanStartNewTest
  226.                                         then TestTStreamSortedCollection;
  227.            cmEmsSortedCollection : if CanStartNewTest
  228.                                      then TestTEmsSortedCollection;
  229.            cmStreamStringCollection : if CanStartNewTest
  230.                                         then TestTStreamStringCollection;
  231.            cmEmsStringCollection : if CanStartNewTest
  232.                                      then TestTEmsStringCollection;
  233.            cmStreamUnSortedStrCollection : if CanStartNewTest
  234.                                              then TestTStreamUnSortedStrCollection;
  235.            cmEmsUnSortedStrCollection : if CanStartNewTest
  236.                                           then TestTEmsUnSortedStrCollection;
  237.  
  238.            { Linked lists }
  239.            cmListSingle : if CanStartNewTest
  240.                             then TestTListSingle;
  241.            cmListDouble : if CanStartNewTest
  242.                             then TestTListDouble;
  243.            cmSortedListSingle : if CanStartNewTest
  244.                                   then TestTSortedListSingle;
  245.            cmSortedListDouble : if CanStartNewTest
  246.                                   then TestTSortedListDouble;
  247.  
  248.            { Tables }
  249.            cmTable : if CanStartNewTest
  250.                        then TestTTable;
  251.            cmObjectTable : if CanStartNewTest
  252.                              then TestTObjectTable;
  253.  
  254.            { Queues }
  255.            cmQueue : if CanStartNewTest
  256.                        then TestTQueue;
  257.            cmDoubleEndedQueue : if CanStartNewTest
  258.                                   then TestTDoubleEndedQueue;
  259.  
  260.            { Stacks }
  261.            cmHugeCollectionStack : if CanStartNewTest
  262.                                      then TestTHugeCollectionStack;
  263.            cmArrayStack: if CanStartNewTest
  264.                            then TestTArrayStack;
  265.            cmHugeArrayStack: if CanStartNewTest
  266.                                then TestTHugeArrayStack;
  267.            cmLinkedStack: if CanStartNewTest
  268.                             then TestTLinkedStack;
  269.            cmStreamStack: if CanStartNewTest
  270.                             then TestTStreamStack;
  271.            cmEmsStack: if CanStartNewTest
  272.                          then TestTEmsStack;
  273.  
  274.            { Binary trees }
  275.            cmBinaryTree : if CanStartNewTest
  276.                             then TestTBinaryTree;
  277.            cmAVLTree : if CanStartNewTest
  278.                          then TestTAVLTree;
  279.  
  280.            { B trees }
  281.            cmBTree : if CanStartNewTest
  282.                        then TestTBTree;
  283.            cmObjectBTree : if CanStartNewTest
  284.                              then TestTObjectBTree;
  285.            cmBPlusTree : if CanStartNewTest
  286.                            then TestTBPlusTree;
  287.            cmObjectBPlusTree : if CanStartNewTest
  288.                                  then TestTObjectBPlusTree;
  289.  
  290.            { List boxes }
  291.            cmSequenceListBox : TestSequenceListBox(lbSequenceListBox);
  292.            cmSortedListBox   : TestSequenceListBox(lbSortedSequenceListBox);
  293.          else
  294.            Exit;
  295.          end; { case }
  296.          ClearEvent(Event);
  297.        end; { if }
  298. end;
  299.  
  300. {****************************************************************************}
  301. { TContainersDemo.Idle                                                       }
  302. {****************************************************************************}
  303. procedure TContainersDemo.Idle;
  304.  
  305.     function IsTileable(P: PView): Boolean; far;
  306.     begin
  307.       IsTileable := P^.Options and ofTileable <> 0;
  308.     end; {...IsTileable }
  309.  
  310. begin
  311.   TApplication.Idle;
  312.   if Clock <> nil then
  313.      Clock^.Update;
  314.   if HeapViewer <> nil then
  315.      HeapViewer^.Update;
  316.   If Desktop^.FirstThat(@IsTileable) <> nil then
  317.     EnableCommands([cmTile, cmCascade])
  318.   else
  319.     DisableCommands([cmTile, cmCascade]);
  320. end;
  321.  
  322. {****************************************************************************}
  323. { TContainersDemo.InitMenuBar                                                }
  324. {****************************************************************************}
  325. procedure TContainersDemo.InitMenuBar;
  326. var
  327.   R: TRect;
  328. begin
  329.   R.Assign(0,0,80,1);
  330.   MenuBar := New(PMenuBar, Init(R, NewMenu(
  331.     NewSubMenu('~F~ile', hcFileMenu, NewMenu(
  332.       NewItem('~D~os Shell...', '', kbNoKey, cmDosShell, hcDosShell,
  333.       NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcQuit,
  334.       nil))),
  335.     NewSubMenu('~S~equences', hcSequencesMenu, NewMenu(
  336.       NewSubMenu('~A~rrays', hcArraysMenu, NewMenu(
  337.         NewSubMenu('~S~tandard arrays', hcStdArraysMenu, NewMenu(
  338.           NewItem('~T~StdArray', '', kbNoKey, cmStdArray, hcStdArray,
  339.           NewItem('T~R~esizableStdArray', '', kbNoKey, cmResizableStdArray,
  340.             hcResizableStdArray,
  341.           NewItem('T~S~ortedStdArray', '', kbNoKey, cmSortedStdArray,
  342.             hcSortedStdArray,
  343.           NewLine(
  344.           NewItem('TSt~d~ObjectArray', '', kbNoKey, cmStdObjectArray,
  345.             hcStdObjectArray,
  346.           NewItem('TRes~i~zableStdObjectArray', '', kbNoKey,
  347.             cmResizableStdObjectArray, hcResizableStdObjectArray,
  348.           NewItem('TS~o~rtedStdObjectArray', '', kbNoKey, cmSortedStdObjectArray,
  349.             hcSortedStdObjectArray,
  350.           nil)))))))),
  351.         NewSubMenu('~H~uge arrays', hcHugeArraysMenu, NewMenu(
  352.           NewItem('~T~HugeArray', '', kbNoKey, cmHugeArray, hcHugeArray,
  353.           NewItem('T~R~esizableHugeArray', '', kbNoKey, cmResizableHugeArray,
  354.             hcResizableHugeArray,
  355.           NewItem('T~S~ortedHugeArray', '', kbNoKey, cmSortedHugeArray,
  356.             hcSortedHugeArray,
  357.           NewLine(
  358.           NewItem('T~H~ugeObjectArray', '', kbNoKey, cmHugeObjectArray,
  359.             hcHugeObjectArray,
  360.           NewItem('TR~e~sizableHugeObjectArray', '', kbNoKey, cmResizableHugeObjectArray,
  361.             hcResizableHugeObjectArray,
  362.           NewItem('TS~o~rtedHugeObjectArray', '', kbNoKey, cmSortedHugeObjectArray,
  363.             hcSortedHugeObjectArray,
  364.           nil)))))))),
  365.         NewSubMenu('~S~tream arrays', hcStreamArraysMenu, NewMenu(
  366.           NewItem('~T~StreamStdArray', '', kbNoKey, cmStreamStdArray,
  367.             hcStreamStdArray,
  368.           NewItem('T~S~treamStdObjectArray', '', kbNoKey,
  369.             cmStreamStdObjectArray, hcStreamStdObjectArray,
  370.           NewItem('TSt~r~eamObjectArray', '', kbNoKey, cmStreamObjectArray,
  371.             hcStreamObjectArray,
  372.           NewLine(
  373.           NewItem('T~E~msStdArray', '', kbNoKey, cmEmsStdArray, hcEmsStdArray,
  374.           NewItem('TE~m~sStdObjectArray', '', kbNoKey, cmEmsStdObjectArray,
  375.             hcEmsStdObjectArray,
  376.           NewItem('TEms~O~bjectArray', '', kbNoKey,
  377.             cmEmsObjectArray, hcEmsObjectArray,
  378.           nil)))))))),
  379.         nil)))),
  380.       NewSubMenu('~C~ollections', hcCollectionsMenu, NewMenu(
  381.         NewItem('T~H~ugeCollection', '', kbNoKey, cmHugeCollection,
  382.           hcHugeCollection,
  383.         NewItem('THugeS~o~rtedCollection', '', kbNoKey, cmHugeSortedCollection,
  384.           hcHugeSortedCollection,
  385.         NewItem('THugeS~t~ringCollection', '', kbNoKey, cmHugeStringCollection,
  386.           hcHugeStringCollection,
  387.         NewItem('THuge~U~nSortedStrCollection', '', kbNoKey,
  388.           cmHugeUnSortedStrCollection, hcHugeUnSortedStrCollection,
  389.         NewLine(
  390.         NewItem('T~S~treamCollection', '', kbNoKey, cmStreamCollection,
  391.           hcStreamCollection,
  392.         NewItem('TSt~r~eamSortedCollection', '', kbNoKey, cmStreamSortedCollection,
  393.           hcStreamSortedCollection,
  394.         NewItem('TStreamStr~i~ngCollection', '', kbNoKey, cmStreamStringCollection,
  395.           hcStreamStringCollection,
  396.         NewItem('TStreamU~n~SortedStrCollection', '', kbNoKey,
  397.           cmStreamUnSortedStrCollection, hcStreamUnSortedStrCollection,
  398.         NewLine(
  399.         NewItem('T~E~msCollection', '', kbNoKey, cmEmsCollection,
  400.           hcEmsCollection,
  401.         NewItem('TE~m~sSortedCollection', '', kbNoKey, cmEmsSortedCollection,
  402.           hcEmsSortedCollection,
  403.         NewItem('TEmsStrin~g~Collection', '', kbNoKey, cmEmsStringCollection,
  404.           hcEmsStringCollection,
  405.         NewItem('TEmsUnSorte~d~Collection', '', kbNoKey,
  406.           cmEmsUnSortedStrCollection, hcEmsUnSortedStrCollection,
  407.         nil))))))))))))))),
  408.       NewSubMenu('~L~inked lists', hcListsMenu, NewMenu(
  409.         NewItem('T~L~ist', '', kbNoKey, cmListSingle, hcListSingle,
  410.         NewItem('T~D~oubleList', '', kbNoKey, cmListDouble, hcListDouble,
  411.         NewItem('T~S~ortedList', '', kbNoKey, cmSortedListSingle,
  412.           hcSortedListSingle,
  413.         NewItem('TS~o~rtedDoubleList', '', kbNoKey, cmSortedListDouble,
  414.           hcSortedListDouble,
  415.         nil))))),
  416.       NewSubMenu('~Q~ueues', hcQueuesMenu, NewMenu(
  417.         NewItem('T~Q~ueue', '', kbNoKey, cmQueue, hcQueue,
  418.         NewItem('T~D~oubleEndedQueue', '', kbNoKey, cmDoubleEndedQueue, hcDoubleEndedQueue,
  419.         nil))),
  420.       NewSubMenu('~S~tacks', hcStacksMenu, NewMenu(
  421.         NewItem('T~H~ugeCollectionStack', '', kbNoKey, cmHugeCollectionStack,
  422.           hcHugeCollectionStack,
  423.         NewItem('T~A~rrayStack', '', kbNoKey, cmArrayStack, hcArrayStack,
  424.         NewItem('TH~u~geArrayStack', '', kbNoKey, cmHugeArrayStack,
  425.           hcHugeArrayStack,
  426.         NewItem('T~L~inkedStack', '', kbNoKey, cmLinkedStack, hcLinkedStack,
  427.         NewItem('TS~t~reamStack', '', kbNoKey, cmStreamStack, hcStreamStack,
  428.         NewLine(
  429.         NewItem('T~E~msStack', '', kbNoKey, cmEmsStack, hcEmsStack,
  430.         nil)))))))),
  431.       NewSubMenu('~T~ables', hcTablesMenu, NewMenu(
  432.         NewItem('T~T~able', '', kbNoKey, cmTable, hcTable,
  433.         NewItem('T~O~bjectTable', '', kbNoKey, cmObjectTable, hcObjectTable,
  434.         nil))),
  435.       nil))))))),
  436.     NewSubMenu('~G~raphs', hcGraphsMenu, NewMenu(
  437.       NewItem('T~B~inaryTree', '', kbNoKey, cmBinaryTree, hcBinaryTree,
  438.       NewItem('T~A~VLTree', '', kbNoKey, cmAvlTree, hcAvlTree,
  439.       NewLine(
  440.       NewItem('TB~T~ree', '', kbNoKey, cmBTree, hcBTree,
  441.       NewItem('T~O~bjectBTree', '', kbNoKey, cmObjectBTree, hcObjectBTree,
  442.       NewLine(
  443.       NewItem('TB~P~lusTree', '', kbNoKey, cmBPlusTree, hcBPlusTree,
  444.       NewItem('TOb~j~ectBPlusTree', '', kbNoKey, cmObjectBPlusTree,
  445.         hcObjectBPlusTree,
  446.       nil))))))))),
  447.     NewSubMenu('~L~ist Boxes', hcListBoxesMenu, NewMenu(
  448.       NewItem('T~S~equenceListBox','',kbNoKey, cmSequenceListBox,
  449.         hcNoContext,
  450.       NewItem('TS~o~rtedSequenceListBox','',kbNoKey, cmSortedListBox,
  451.         hcNoContext,
  452.       nil))),
  453.     NewSubMenu('~O~ptions', hcOptionsMenu, NewMenu(
  454.       NewItem('~N~umber of items', '', kbNoKey, cmTotalItems, hcTotalItems,
  455.       NewItem('Number of ~d~uplicates', '', kbNoKey, cmTotalDuplicates,
  456.         hcTotalDuplicates,
  457.       nil))),
  458.     NewSubMenu('~W~indow', hcWindowMenu, NewMenu(
  459.       NewItem('~T~ile', '', kbNoKey, cmTile, hcTile,
  460.       NewItem('C~a~scade', '', kbNoKey, cmCascade, hcCascade,
  461.       NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcClose,
  462.       NewItem('Cl~o~se all', '', kbNoKey, cmCloseAll, hcCloseAll,
  463.       NewItem('~R~efresh display', '', kbNoKey, cmRefresh, hcRefresh,
  464.       NewLine(
  465.       NewItem('~S~ize/Move', 'Ctrl-F5', kbCtrlF5, cmResize, hcResize,
  466.       NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcZoom,
  467.       NewItem('~N~ext', 'F6', kbF6, cmNext, hcNext,
  468.       NewItem('~P~revious', 'Shift-F6', kbShiftF6, cmPrev, hcPrev,
  469.       NewLine(
  470.       NewItem('~V~ideo Mode', '', kbNoKey, cmVideoMode, hcVideoMode,
  471.       nil))))))))))))),
  472.     NewSubMenu('~H~elp', hcSequencesMenu, NewMenu(
  473.       NewItem('~A~bout...', '', kbNoKey, cmAbout, hcAbout,
  474.       nil)),
  475.     nil))))))))));
  476. end;
  477.  
  478. {****************************************************************************}
  479. { TContainersDemo.SetNumberOfDuplicates                                      }
  480. {****************************************************************************}
  481. procedure TContainersDemo.SetNumberOfDuplicates;
  482. var
  483.   S : string;
  484.   N : LongInt;
  485.   Code : Integer;
  486. begin
  487.   Str(TotalDuplicates, S);
  488.   if InputBox('Number of duplicates...', 'Number of duplicates to insert in '+
  489.        'tests:', S, 5) <> cmCancel
  490.     then begin
  491.            Val(S, N, Code);
  492.            if Code <> 0
  493.              then MessageBox('Not a valid number.', nil, mfError + mfOkButton)
  494.              else if (N < 1) or (N > 100)
  495.                     then MessageBox('Number must be between 1 and 100.',
  496.                            nil, mfError + mfOkButton)
  497.                     else TotalDuplicates := N;
  498.          end; { if }
  499. end;
  500.  
  501. {****************************************************************************}
  502. { TContainersDemo.SetNumberOfItems                                           }
  503. {****************************************************************************}
  504. procedure TContainersDemo.SetNumberOfItems;
  505. var
  506.   S : string;
  507.   N : LongInt;
  508.   Code : Integer;
  509. begin
  510.   Str(TotalItems, S);
  511.   if InputBox('Number of items...', 'Number of items to use in tests:',
  512.        S, 5) <> cmCancel
  513.     then begin
  514.            Val(S, N, Code);
  515.            if Code <> 0
  516.              then MessageBox('Not a valid number.', nil, mfError + mfOkButton)
  517.              else if (N < 10) or (N > 10000)
  518.                     then MessageBox('Number must be between 10 and 10000.',
  519.                            nil, mfError + mfOkButton)
  520.                     else TotalItems := N;
  521.          end; { if }
  522. end;
  523.  
  524. {****************************************************************************}
  525. { TContainersDemo.ShowAboutDialog                                            }
  526. {****************************************************************************}
  527. procedure TContainersDemo.ShowAboutDialog;
  528. var
  529.   Dlg : PDialog;
  530.   R : TRect;
  531.   Control, HScroll : PView;
  532. Begin
  533.   R.Assign(20,4,59,19);
  534.   New(Dlg, Init(R, 'About...'));
  535.   Dlg^.Options := $0343;
  536.  
  537.   R.Assign(2,2,37,12);
  538.   Control := New(PStaticText, Init(R, ^C'"Tests Demo Program"'^M+
  539.      ^M+
  540.      ^C'Containers Library (TM) v1.0'^M+
  541.      ^C''^M+
  542.      ^C'Copyright (C) 1995, 1996'^M+
  543.      ^C'by BitSoft Development, L.L.C.'^M+
  544.      ^C''^M+
  545.      ^C' All rights reserved.'^M+
  546.      ^C''));
  547.   Dlg^.Insert(Control);
  548.  
  549.   R.Assign(14,12,26,14);
  550.   Control := New(PButton, Init(R, 'O~k~', cmOk, bfNormal));
  551.   Dlg^.Insert(Control);
  552.  
  553.   Dlg^.SelectNext(False);
  554.  
  555.   if Application^.ValidView(Dlg) <> NIL then
  556.     Desktop^.ExecView(Dlg);
  557.   if Dlg <> nil then
  558.     Dispose(Dlg, Done);
  559. end;
  560.  
  561. end.